package lianxi.pro;

public class Warehouse {
	// 仓库的存储长度
	private int len;
	// 初始化产品数组，仓库里存放产品数组
	private Product[] proWare;
	// 栈的下标
	private int index;

	public Warehouse(int len) {
		super();
		this.len = len;
		//
		proWare = new Product[this.len];
		// 初始化空栈的下标为0
		index = 0;
	}

	/**
	 * @param pro
	 *            进栈的操作
	 */
	public synchronized void push(Product pro) {
		// 仓库中产品数组存放量已经达到仓库的存储量
		if (index >= len) {
			try {
				System.out.println("仓库已满");
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		// 将产品存入仓库
		proWare[index] = pro;
		// 栈顶位置加一
		index++;
		// 输出进栈产品 的信息
		System.out.println("入库操作：" + pro.getProName());
		// 需要将之前等待的生产者的消费者唤醒，等价于将全部等待的线程唤醒
		this.notifyAll();

	}

	public synchronized Product pop() {
		// 出库前判断仓库是否为空
		if (index <= 0) {
			try {
				// 仓库为空，消费者需要等待生产者生产产品
				// 消费者进入等待队列
				System.out.println("存货不足");
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		// 初始化产品暂时存放将要出库的产品
		Product pro = null;
		// 将栈顶指针往下移动，达到产品位置
		index--;
		// 进行出库的操作
		pro = proWare[index];
		// 将刚刚出去的 产品位置设置为空
		proWare[index] = null;
		// 输出信息
		System.out.println("出库操作：" + pro.getProName());
		// 需要将之前等待消费者的生产者唤醒，等价于将全部等待的线程唤醒
		this.notifyAll();
		return pro;
	}

}
